在執行 docker run
指令時,有一個參數是 --net
,它可以設定在執行 Docker Container 是要使用哪一種的網路模式,目前所知道的網路模式有 none、container、host、bridge、overlay… 等等的模式,它們是透過使用 Linux 的 libnetwork 所建立出來的網路模式,以下分別說明這些網路模式:
none: 在執行 container 時,網路功能是關閉的,所以無法與此 container 連線
container: 使用相同的 Network Namespace,所以 container1 的 IP 是 172.17.0.2 那 container2 的 IP 也會是 172.17.0.2
host: container 的網路設定和實體主機使用相同的網路設定,所以 container 裡面也就可以修改實體機器的網路設定,因此使用此模式需要考慮網路安全性上的問題
bridge: Docker 預設就是使用此網路模式,這種網路模式就像是 NAT 的網路模式,例如實體主機的 IP 是 192.168.1.10 它會對應到 Container 裡面的 172.17.0.2,在啟動 Docker 的 service 時會有一個 docker0 的網路卡就是在做此網路的橋接。
overlay: container 之間可以在不同的實體機器上做連線,例如 Host1 有一個 container1,然後 Host2 有一個 container2,container1 就可以使用 overlay 的網路模式和 container2 做網路的連線。
以上就是目前在 Docker 主要可以使用的網路模式,另外常會看到 CNM 這個名詞,它的全名是 Container Network Model,定義了 Container 的網路模型所要的一些規範和標準。
今天主要的實作就是要測試 none、container、host、brige的網路模型,另外的overlay 網路模型就留在明天來實作。
Example1:
在使用 docker run
指令時,指定 --net=none
的網路模式,確認執行結果,指令如下:
$ docker run -it --net=none joffotron/docker-net-tools
進入 container 入後輸入 ifconfig
指令,如下圖
從上圖可以看到除了 127.0.0.1 之外沒有其它的 IP 位址,另外 ping google 看看
結果確定了 none 的模式關閉了網路連線
Example2:
測試開啟了 container1 之後,再開啟 container2 並且設定 --net=container:container1
的參數,測試 container1和container2的網路資訊是否相同,步驟如下:
$ docker run --name container1 -it joffotron/docker-net-tools
$ docker run --name container2 --net=container:container1 -it joffotron/docker-net-tools
ifconfig
指令,查看 container1 和 container2 的網路資訊內容是否相同,如下圖上圖可以確認 container1 和 container2 的網路資訊是相同的
Example3:
在執行 docker run
指令時,參數指定為 --net=host
,測試 host 模式。
執行的指令如下:
$ docker run --net=host -it joffotron/docker-net-tools
執行的結果如下圖:
可以看到 Container 的網路資訊和實體主機的網路資訊是相同的結果
Example4:
在執行 docker run
指令時,參數指定為 --net=bridge
,測試 bridge模式。
執行的指令如下:
$ docker run --net=bridge -it joffotron/docker-net-tools
執行結果如下圖
可以看到使用 Bridge模式,會建立了 172.17.0.2 的 IP,它會橋接到實體主機的docker0的虛擬網路卡。
今天已經介紹了 Docker 的網路模式和實作了 none、container、host、bridge的網路模式,明天會繼續實作 overlay 的網路模式。
--net=container:container1 它跟前面提到的 --link 應該不一樣吧 ?
--link
主要目的是要讓 container 可以連結起來,然後 --net=container:container1
是要讓新啟動的 container 和 container1要有相同的網路設定,像是相同的 IP Address。
所以 --link
和 --net=container:container1
是不一樣的東西。